/*
 * Busqueda.cpp
 *
 *  Created on: Apr 10, 2014
 *      Author: carlos
 */

#include "Busqueda.h"
#include "../../logical_layer/EntityFactory.h"
#include "../../logical_layer/entities/SimpleSecondaryIndex.h"
#include "../../logical_layer/entities/SimpleStringSecondaryindex.h"
#include "../../logical_layer/entities/Twit.h"
#include "../../logical_layer/entities/Rss.h"
Busqueda::Busqueda(string claveComando, string tipoBusqueda,
		string tipoBusquedaLeyenda, FileHandler* fileHandler) :
		Command(claveComando, tipoBusquedaLeyenda, fileHandler), tipoBusqueda(
				tipoBusqueda) {

}

void Busqueda::execute(int argc, char** argv) {
	cout << "resultados de la busqueda por: " << tipoComandoLeyenda << endl;
	if (argc < 3) {
		cout
				<< "ingrese numero de id que desea consultar. Consulte con la opcion -h"
				<< endl;
		return;
	}
	string tipoBusqueda(argv[1]);
	if (BUSQUEDA_ID == tipoBusqueda) {
		cout<<endl<<endl;
		int identificador = atoi(argv[2]);
		cout << "Busqueda Twit por identificador: " << identificador << endl;
		this->mostrarBusquedasPorIdTwit(identificador);
		cout<<endl<<endl;
		cout << "Busqueda RSS por identificador: " << identificador << endl;
		this->mostrarBusquedasPorIdRss(identificador);

	}

	if (BUSQUEDA_FECHA == tipoBusqueda) {
		int fecha = atoi(argv[2]);
		cout << "Mostrando los resultados por fecha " << fecha << endl;
		this->mostrarResultadosBusquedaFechaExacta(fecha);
	}

	if (BUSQUEDA_AUTOR == tipoBusqueda) {
		string autor(argv[2]);
		cout << "Mostrando los resultados por autor " << autor << endl;
		this->mostrarResultadosAutor(autor);
	}

	if (BUSQUEDA_TITULO == tipoBusqueda) {
		string titulo(argv[2]);
		cout << "Mostrando los resultados por titulo " << titulo << endl;
		this->mostrarResultadosTitulo(titulo);
	}
}

void Busqueda::mostrarResultadosTitulo(string titulo) {
	SimpleStringSecondaryindex* ssIndex =
			(SimpleStringSecondaryindex*) this->fileHandler->getTituloIdRss()->find(
					titulo);
	if (ssIndex != NULL) {
		cout << ssIndex->toString() << endl;
		if (this->visulizarPantalla()) {
			vector<ID> idsRelacionales = ssIndex->getId_relacionales();
			vector<ID>::iterator itIdsRelacionales;
			for (vector<ID>::iterator it = idsRelacionales.begin();
					it != idsRelacionales.end(); it++) {
				this->mostrarBusquedasPorIdRss((*it));
			}
		}
	} else {
		cout << "No se encontraron resultados" << endl;
	}
}

void Busqueda::mostrarResultadosAutor(string autor) {
	SimpleStringSecondaryindex* ssIndex =
			(SimpleStringSecondaryindex*) this->fileHandler->getAutorIdTwit()->find(
					autor);

	if (ssIndex != NULL) {
		cout<<ssIndex->toString()<<endl;
		if (this->visulizarPantalla()) {
			vector<ID> idsRelacionales = ssIndex->getId_relacionales();
			vector<ID>::iterator itIdsRelacionales;
			for (vector<ID>::iterator it = idsRelacionales.begin();
					it != idsRelacionales.end(); it++) {
				this->mostrarBusquedasPorIdTwit((*it));
			}
		}

	} else {
		cout << "No existen twtis para el autor" << autor << endl;
	}
}

void Busqueda::mostrarBusquedasPorIdTwit(int identificador) {
	Twit twit;
	twit.setId(identificador);
//EL HASH DEBERIA DEVOLVER EL twit y no el bloque!!!!
	Twit* twitRecoverd = this->fileHandler->getHash()->searchTwit(&twit);
	if (twitRecoverd != NULL) {
		cout << twitRecoverd->getId() << endl;
		cout<<twitRecoverd->getAutor()<<endl;
		cout << *twitRecoverd->geFecha() << endl;
		cout << twitRecoverd->getContenido() << endl;
	} else {
		cout << "No existe el twit con id " << identificador << endl;
	}
}
void Busqueda::mostrarBusquedasPorIdRss(int identificador) {
	Rss rss;
	rss.setId(identificador);
	Rss* rssRecoverd = this->fileHandler->getHashRss()->searchRss(&rss);
	if (rssRecoverd != NULL) {
		cout << rssRecoverd->getId() << endl;
		cout << rssRecoverd->getTitulo() << endl;
		cout << rssRecoverd->getDescripcion() << endl;
	} else {
		cout << "No existe el RSS con id " << identificador << endl;
	}

}
void Busqueda::mostrarResultadosBusquedaFechaExacta(int aniomesdia) {
	SimpleSecondaryIndex* ientidad =
			(SimpleSecondaryIndex*) this->fileHandler->getFechaAscIdTwit()->find(
					StringUtils::intToString(aniomesdia));
	if (ientidad != NULL) {
		cout<<ientidad->toString()<<endl;
		if (this->visulizarPantalla()) {
			vector<ID> idsRelacionales = ientidad->getId_relacionales();
			vector<ID>::iterator itIdsRelacionales;
			for (vector<ID>::iterator it = idsRelacionales.begin();
					it != idsRelacionales.end(); it++) {
				this->mostrarBusquedasPorIdTwit((*it));
			}
		}

	} else {
		cout << "No existen twtis para la fecha" << aniomesdia << endl;
	}

}
Busqueda::~Busqueda() {
}

